package com.easydict.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据字典转换注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EasyDict {

    /**
     * 数据字典类型代码
     * <p>必填项，用于标识字典类型</p>
     *
     * @return 字典类型代码，不能为空
     */
    String dictType() default "";

    /**
     * 自定义字典字段名后缀
     * <p>如果不指定，则使用全局配置的后缀</p>
     *
     * @return 字典字段后缀，默认为空字符串表示使用全局配置
     */
    String suffix() default "";

    /**
     * 是否启用缓存
     * <p>控制该字段的字典值是否使用缓存</p>
     *
     * @return true表示启用缓存，false表示不使用缓存
     */
    boolean cache() default true;

    /**
     * 缓存过期时间（秒）
     * <p>-1表示使用全局配置的过期时间</p>
     *
     * @return 缓存过期时间，单位为秒
     */
    long cacheExpire() default -1;

    /**
     * 解析失败时的回退值
     * <p>当字典解析失败时返回的默认值</p>
     *
     * @return 回退值，空字符串表示使用默认回退策略
     */
    String fallback() default "";

    /**
     * 解析器优先级
     * <p>当有多个解析器时，数值越小优先级越高</p>
     *
     * @return 优先级数值，默认为1000
     */
    int priority() default 1000;

    /**
     * 是否异步解析
     * <p>控制字典解析是否在异步线程中执行</p>
     *
     * @return true表示异步解析，false表示同步解析
     */
    boolean async() default false;

    /**
     * 字典分组
     * <p>用于支持多数据源字典，不同分组可以有不同的解析策略</p>
     *
     * @return 字典分组名称，默认为"default"
     */
    String group() default "default";

    /**
     * 指定用于字典翻译的枚举类（优先于 enumClassName）
     */
    Class<?> enumClass() default Void.class;

    /**
     * 以类名字符串指定枚举类（如：com.xxx.FromTypeEnum 或 简单类名 FromTypeEnum）
     */
    String enumClassName() default "";

    /**
     * 从枚举实例读取“代码”的方法名
     */
    String enumCodeMethod() default "getCode";

    /**
     * 从枚举实例读取“显示值”的方法名
     */
    String enumLabelMethod() default "getLabel";

}
